package com.csot.ipscan;

import cn.hutool.core.net.NetUtil;
import cn.hutool.core.util.StrUtil;
import com.jfinal.log.Log;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.concurrent.Callable;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Task implements Callable<String> {

    Log log = Log.getLog(Task.class);

    Long i = 0L;

    public Task(Long ip_i) {
        this.i = ip_i;
    }

    @Override
    public String call() throws Exception {
        // TODO Auto-generated method stub
        String ip = NetUtil.longToIpv4(i);
        if (ping(ip)) {
            SysData.list.add(i);
            SysData.iplist.add(ip);
            return "ip";
        } else {
            return "no";
        }
    }


    public boolean ping(String ipAddress) {
        BufferedReader in = null;
        Runtime r = Runtime.getRuntime();  // 将要执行的ping命令,此命令是windows格式的命令
        String osName = System.getProperty("os.name");//获取操作系统类型
        String pingCommand = "";
        if (osName.toLowerCase().contains("linux")) {
            pingCommand = "ping -c 3 -i 0 " + ipAddress;
        } else
            pingCommand = "ping " + ipAddress + " -n 3 -w 1000";

        try {   // 执行命令并获取输出
            System.out.println(pingCommand);
            Process p = r.exec(pingCommand);
            if (p == null) {
                return false;
            }
            in = new BufferedReader(new InputStreamReader(p.getInputStream()));   // 逐行检查输出,计算类似出现=23ms TTL=62字样的次数
            String line = null;
            while ((line = in.readLine()) != null) {
                if (StrUtil.containsIgnoreCase(line, "ttl")) {
                    return true;
                }
            }   // 如果出现类似=23ms TTL=62这样的字样,出现的次数=测试次数则返回真
            return false;
        } catch (Exception ex) {
            log.error("", ex);  // 出现异常则返回假
            return false;
        } finally {
            try {
                in.close();
            } catch (IOException e) {
                log.error("", e);
                e.printStackTrace();
            }
        }
    }


}
